/*
 * 代号：凤凰
 * http://www.jphenix.org
 * 2014-06-13
 * V4.0
 */
package com.jphenix.ver;

import com.jphenix.share.util.SFilesUtil;
import com.jphenix.standard.docs.ClassInfo;

/**
 * 获取框架版本信息
 * http://www.jphenix.org
 * @author 刘虻
 * 2014-06-03
 */
@ClassInfo({"2021-09-12 01:50","获取框架版本信息"})
public class PhenixVer {

    /**
     * 版本控制用
     */
    final static String VER = "2021-09-12 01:50";
    
    /**
     * 更新次数
     */
    public final static int UPDATE_COUNT = 148;
    
    /**
     * 获取框架版本号
     * @author 刘虻
     * 2008-7-19下午03:34:51
     * @return 框架版本号
     */
    public final static String getVER() {
        return VER;
    }
    
    /**
     * 获取更新次数
     * @author 刘虻
     * 2008-7-19下午03:49:14
     * @return 更新次数
     */
    public final static int getUpdateCount() {
        return UPDATE_COUNT;
    }
    
    /**
     * 输出框架版本信息(图形)
     * @author 刘虻
     * 2008-7-19下午03:36:16
     */
    public static void printVERShowInfo() {
        System.out.println(getVerShowInfo());
        try {
            Thread.sleep(300);
        }catch(Exception e) {}
    }
    
    
    /**
     * 输出框架版本信息(文字)
     * @author 刘虻
     * 2008-7-25下午02:23:08
     */
    public static void printVERInfo() {
        System.out.println(getVerInfo());
        try {
            Thread.sleep(300);
        }catch(Exception e) {}
    }
    
    /**
     * 获取文字形式的版本信息
     * @author 刘虻
     * 2008-7-25下午02:22:11
     * @return
     */
    public final static String getVerInfo() {
        
        //构造返回值
        StringBuffer reSbf = new StringBuffer();
        
        //JDK版本号
        String jdkVer = String.valueOf(System.getProperty("java.version"));
        //需要输出的JDK版本号信息
        String jdkVerInfo = jdkVer;
        for(int i=0;i<30-jdkVer.length();i++) {
        	jdkVerInfo += " ";
        }
        
        reSbf
            .append("\n\n\n")
            .append("**********************************************\n")
            .append("*              JPhenix Framework             *\n")
            .append("* JDK:         ").append(jdkVerInfo).append("*\n")
            .append("* TimeVer:     ")
            .append(getVER())
            .append("              *\n")
            .append("* UpdateCount: ")
            .append(getUpdateCount())
            .append("                           *\n")
            .append("**********************************************\n\n\n");
        return reSbf.toString();
    }
    
    /**
     * 获取版本信息
     * @author 刘虻
     * 2008-7-19下午03:35:14
     * @return 版本信息
     */
    public final static String getVerShowInfo() {
        
        //构造返回值
        StringBuffer reSbf = new StringBuffer();
        
        reSbf
            .append("\n\n\n")
            .append("                                ,ihA&XGhh2SiiisssS5r:.\n")
            .append("                                     :SXHA&A&h932;    .;;,.\n")
            .append("                       :#;             s2&Gh&A&ABBA2r.    :r;.\n")
            .append("                     .#@h               s5HAGXAAGA#@@@@Hs.   :;\n")
            .append("            ;hAHr    s@5;                s2&A3XAMAAMM##@@@Mr\n")
            .append("         ;A@@@@#.    B@5;.               ,r5hA9SGMA&&&AMAhA##9:\n")
            .append("       s#@@@#G2r    ,HH&r;.               rr5XG2ihA33AGGH#B9XH@#s\n")
            .append("    .r#@@#AA&X3,    ,3,sHXr               :ri2h3X2hAhX3X55hMA55#@H:\n")
            .append("   .3@MHHAGHA92:     S  S#i.              .rS5h39G3GAAGhh2r5HBs.X@@G.\n")
            .append("    BB3AG&&HA93s     :. SAir, .;sSs;;.     rS5X552h2h9&G2G3ss3#: .A@@;\n")
            .append("   3@;AAhGAAHHXS,       2&Srr:;si535i5s;:,:r5X29hi295959X:23irX@;  X@@r\n")
            .append("  ,@.;B&GAGhHHG3S       rJPhenix999HM@BXXhA3AAG3h25X2S2i2i.rh5sG@;  i@M\n")
            .append("  #: #AGAhGGHhA#&r     XAMX3AS9A&GShBB##MHBA&G2XS3Ss9s5is3X s&25#@;  h#\n")
            .append(" :r X#G9GhGh&3A@#3S.   3AMH&AAHHHB&hh9AA3&3&&X2i2sXrXisSssA2 sG59#@:  5\n")
            .append(".r  @B3hAX99hhAMHMAA9Si9AHMMH33hG&AA&h3G3X25Si25iS2  ;;22iSMi 2Gsh@@.\n")
            .append("s. S@&3h&2sS2i359##M@###AAAHBH2S2GAA&GX5X5Ssss: r2;. , s25s2@; &X,M@G\n")
            .append(";  H#G9&&22rSrrsSAGAABABHA&&G&G2ii2&H&X2XX25X2s  r,     23siA@.,#:;@@\n")
            .append("   A#&GAG2A;ri;ssir22XX3XX239GG2r5Si9BAX23hhMX2Xi ,     sh9i9MM XB B@s\n")
            .append("   H#9sA9XBs;5r;.Srr5i52Ss52X395522i:9@@@3&#@@h3sX       2G2&B#2.@,;@@\n")
            .append("   ##5 #3hM5;SSr  hirrS25X2X5SXXXX3: ;M@@@###@##A#9.     iH:r@M@.2A @@,\n")
            .append("   #@s #hXH9s:AS,  &ir,;hX2ShMMHG9.  :.@#@#A##G##M#@@3r; i#; G@@G @ 3@X\n")
            .append("   A@i BA2HAG.XA2   B3,  r&#M;      . ;@#@SA@M22#@BHG@irAABX  @@@ h;;@h\n")
            .append("   2@S G@XX#B; @AS   #A  A@s          H2M#,hAih r@Bihs#h ;@A  i@@:,G @&\n")
            .append("    @3 r@h H#A :@B.  :@A##           h rA,.35;B ,@@r,H:&# s@   @@5 @ @M\n")
            .append("    B@  @# .@@. :@9   i@@H5;        &r Xs S@A   i#B#,,# 9M:@M  ;@H @ @@\n")
            .append("     @. @@, #@&  ,@s   @@#@s        2   S M@@r  ##HAM 99 h@@@@  @@ @ B@\n")
            .append("     AA i@A  @@:  ,@,  3@@@;     :r.     .@@@@ ;##GG#  @. ##r@  G@ M 5@\n")
            .append("      @  @@  5@@   .,    ,.   ,:,.;5X:    S2M@MM##GB#  &@ S@ @,  @5A. &\n")
            .append("      ,9 ;@2  #@@         rG#@@@@@@B@@@5:,,sM#G#@G&@M  :@ .@.@   S@A,\n")
            .append("          @@,  B@@   ;i@@#i        ,:;i@@B5r. s@s G@i   @  @@B   ,@H:\n")
            .append("           @@   9@@5:.2:   :&#HAG9X2S;. #B.,2@@;  @@    @  @@.   ;@A;\n")
            .append("            @@   s@@      hA;        ,;iG@@@&.   3@:    @ X@;    2M#.\n")
            .append("             @@    h@s   5:               :@@A9A@@,    @@h@r     B2@\n")
            .append("              M@.    3s ..                  ,rr;.     5@S,       @2#\n")
            .append("               rS                                                 ;\n")
            .append("\n\n JDK:[").append(System.getProperty("java.version")).append("]\n")
            .append(getVER())
            .append(" ")
            .append(UPDATE_COUNT)
            .append("\n\n\n");
        return reSbf.toString();
    }
    
    /**
     * 获取框架包文件名
     * @return 框架包文件名
     * 2017年3月31日
     * @author MBG
     */
    public static String getSDkFileName() {
      //判断上传的是不是当前核心框架包
      java.net.URL url = SFilesUtil.class.getClassLoader().getResource("com/jphenix/share/util/SFilesUtil.class");
      if(url!=null){
        //文件名
        String sdkFileName = url.toString();
        int point = sdkFileName.indexOf("!");
        if(point>0){
          sdkFileName = sdkFileName.substring(0,point);
        }
        point = sdkFileName.lastIndexOf("/");
        if(point>0){
          sdkFileName = sdkFileName.substring(point+1);
        }
        return sdkFileName;
      }
      return "";
    }
    
    
    /**
     * 测试入口
     * @author 刘虻
     * 2008-7-19下午03:45:21
     * @param arg0 传入参数
     */
    public static void main(String[] arg0) {
        printVERInfo();
    }
    
    
    /**
     * 148 2021-09-12 01:50
     * 为架构增加了编译脚本工具类com.jphenix.one.boot.BuildScriptClasses
     * 并且将打包工具类中，增加了打包之前，重新编译脚本类
     * 
     * 148 2021-09-11 17:45
     * 日志方法 tlog log info debug 增加了日志提示标题入参
     * 
     * 148 2021-05-12 15:46
     * 修改了构造函数中，处理页号值的错误
     * 
     * 148 2021-05-10 10:34
     * 解决了预览代码与编译代码行号不一致的问题，查看报错信息时，在预览代码中定位不准确
     * 
     * 148 2021-03-04 15:39
     * 支持新版本的H2数据库
     * 
     * 148 2020-09-09 16:36
     * 脚本功能中，增加了将传入参数变量作为类变量模式。
     * 目前这个功能仅适用于非驻留内存脚本，不适用于扩展包脚本，不适用于动作脚本。
     * 
     * 目前该功能主要用在字典脚本。
     * 以前字典脚本可以设置成常驻内存类。这回不建议用常驻内存类。
     * 在查询时，需要传入字典脚本实例，在获取字典实例代码中，增加了传入参数
     * （字典脚本编写时，需要配置传入参数，并勾选将传入参数变量作为类变量）
     * 这样就可以使字典脚本明确解析哪个字段的什么值，以及其他用法。
     * 
     * 147 2020-09-05 00:52
     * 增加了查询记录集并自动缓存，自动刷新缓存的方法 qb 方法
     * 
     * 147 2020-08-20 10:10
     * 原本整套程序是跑在默认编码格式中的，比如在windows下跑gbk格式的，后来升级tomcat后，需要强制跑在utf-8下，写日志文件的编码格式就错了，这回拆成控制台和写文件两个编码
     * 
     * 147 2020-08-05 16:26
     * 修改了内置开发控制台入口，使其更加安全
     * 
     * 146 2020-07-14 15:00
     * 废弃了方法setOutNoStringFormat,改用 outNoFormat，增加了 standardFormat 方法
     * 
     * 146 2020-06-30 11:25
     * HttpServletRequestImpl 在获取当前请求路径中，增加了从配置文件中获取根URL，防止请求头被篡改，返回其它地址URL
     *
     * 146 2020-05-17 17:58
     * 增加了传统类支持扩展库，但实际上这种情况中，指定的扩展库是加载到全局根类加载器中的。至少这样做实现了不同功能的库文件分类存放。
     * 支持热修改传统类后，自动刷新受影响的脚本程序。
     * 
     * 146 2020-03-16 10:00
     * 增加了配置文件参数script_disabled_remote，可以禁用远程脚本路由功能
     * 在集群服务中，去掉了心跳包防止阻塞线程，实际证明没什么用处
     * 
     * 146 2020-03-04 17:26
     * 修改了Json类解析\\\" 时，这种连续转义字符处理错误
     * 
     * 146 2020-03-02 03:20
     * 增加了高级调用方法（支持通过代理服务器调用）
     * 
     * 146 2020-01-07 09:49
     * 定时任务脚本中增加了是否禁用该定时任务功能
     * 
     * 146 2019-12-26 11:16
     * 数据库功能，增加了JNDI模式
     * 
     * 146 2019-12-23 17:12
     * 修改了集群间数据通信内容格式，支持复杂参数调制解调功能
     * 
     * 146 2019-12-12 14:21
     * 脚本支持在发生异常时拦截异常信息，处理后并拼装成返回值，顺利返回到调用方。具体详见ScriptLoader类中的注释
     * 
     * 146 2019-12-10 18:11
     * 支持集群内部，可以通过路由转发方式上传文件
     * 
     * 146 2019-12-06 17:11
     * 在脚本中支持另写两个方法，一个是在执行中发生异常时调用的方法doException。
     * 一个是无论执行正常结束，异常结束时都调用的方法doFinally
     * 
     * 146 2019-12-05 10:34
     * 完善了接口路由针对目标系统无虚拟路径的处理方法
     * 
     * 146 2019-11-28 15:47
     * 使用Alibaba编码规范修正代码中的瑕疵
     *
     * 146 2019-11-12 13:53
     * 支持将编译前的Java文件 另存到指定文件夹 （通常用于提交到Git，通过PipeLine做代码质量检查）
     * 另存路径配置节点名：script_java_souce_base_path
     * 
     * 146 2019-11-05 15:57
     * 增加了内存数据库操作功能 
     * 
     * 146 2019-11-04 20:59
     * 针对解析扩展库中readme.txt文件，测试并修改了发现的错误。
     * 146 2019-11-01 09:13
     * 修改了错误标记，既可以存在历史错误信息，又可以清除错误标记
     * 
     * 146 2019-10-30 10:09
     * 支持脚本扩展库中，解析readme.txt中引用的其它扩展库信息
     * 
     * 146 2019-10-23 10:12
     * 增加了在本地模拟复杂网络场景（服务器A无法直接访问服务器C，只能通过服务器B访问）
     * 
     * 146 2019-10-21 10:47
     * 真正支持了并行集群（自动同步同分组中的程序代码），串行集群（无需加分组前缀即可实现远程自动路由调用）
     * 
     * 145 2019-08-31 14:43
     * 修改了数据库事务处理，在事务脚本中，查询方法也走事务。否则无法查询到刚修改的数据。
     * 修改了HTTP请求信息值
     * 
     * 145 2019-08-21 09:31
     * 脚本编辑界面增加了模糊搜索脚本
     * 数据库查询，增加了锁定表头
     * 
     * 145 2019-08-09 13:31
     * 增加了打包文件方法中，可以单独设置压缩包内文件路径的方法createZipFile
     * 
     * 145 2019-07-29 12:29
     * 增加了字节数组转为16进制字符串的方法
     * 
     * 145 2019-07-20 10:55
     * 改用JDK1.7编译脚本
     * 去掉了边以后脚本文件中可以显示开发环境绝对路径的漏洞
     * 增加了内置脚本版本号与脚本加载器不一致的错误警告
     * 
     * 144 2019-07-15 20:04
     * 备份包扩展名由jar改为zip
     * 将备份文件，上传文件，日志文件的根文件夹默认迁移到了项目同级的file_resources文件夹中，避免部署项目时，还要清理这些文件。
     * 
     * 143 2019-07-11 10:20
     * ABase基类增加了douStr(Object)方法
     * 
     * 143 2019-06-28 15:20
     * 将允许跨站的域名放到配置文件中设置。配置文件中的参数主键servlet_access_control_allow_origin，多个域名用逗号分割，或者分号分割。
     * 
     * 143 2019-06-26 11:14
     * 重构了序列号生成器，以及相关受影响的类
     * 
     * 142 2019-06-20 08:34
     * SDate增加了cn克隆方法，直接返回SDate类型类实例
     * 
     * 142 2019-06-18 13:48
     * 将数据库信息类放入到 DBQuery 中，这样在执行更新语句时，可以刷新对应的表状态。
     * 修改了代码同步时，无法更新最大脚本代码的错误
     * 
     * 142 2019-05-16 12:29
     * halt后，有些连接的Tcp Socket 会出现TIME_WAIT 和 CLOSE_WAIT
     * ，所以遇到这种情况时，在配置文件中增加<system_no_halt>true</system_no_halt>
     * 
     * 142 2019-05-11 12:07
     * 增加了心跳包防止阻塞机制
     * 
     * 142 2019-04-29 13:05
     * 增加了Maven下载包以及关联包功能
     * 
     * 142 2019-04-24 11:06
     * 数据库连接池中增加了配置文件参数datamanager_no_out_log,可以屏蔽数据库连接池输出日志
     * 
     * 142 2019-04-17 15:08
     * ActionBeanParent中，带状态的out方法中，增加了日志输出
     * 
     * 142 2019-04-16 13:51
     * 去掉了总过滤器中强制编码转换，放到了ServletFilter中。这样避免了图片之类的请求，也要强制转换编码格式。
     * 修改了内置Servlet容器中获取Content-Type值缺少后半部分的错误
     * 
     * 142 2019-04-15 10:05
     * 修改了调用脚本做身份验证，如果验证失败不抛异常，而是返回报错信息
     * 
     * 142 2019-04-10 11:26
     * 修改了支持扩展包库的脚本壳类，避免使用线程上下文类加载器无法加载扩展库中的资源。
     * 
     * 142 2019-03-25 11:18
     * 反向触发调用中，外部服务器响应后，将信息通过Nginx负载均衡发回给内部服务器，接收服务器需
     * 要判断是否为发起服务器，如果不是，需要将信息转发给内部同分组的发起服务器
     * 
     * 142 2019-03-15 13:37
     * 支持指定数据源操作数据库时，不将语句输出到控制台，而且还可以将语句写入到独立的日志文件中。
     * 
     * 142 2019-03-08 09:17
     * 解决了一个忧郁简化了数据操作类导致一个方法自己调用自己的错误
     * 
     * 142 2019-03-06 18:48
     * 简化了数据库操作类
     * 增加了sql语句日志输出控制，可以指定某个数据源不输出日志到控制台，或者不写入日志到文件
     * 
     * 142 2019-03-05 13:04
     * Json类中，增加了两个获取当前节点主键数组(keys())和序列的方法(keyList())
     * 
     * 142 2019-01-31 14:13
     * 在调用集群方法时，把调用者类信息传入，方便在日志中查看调用者
     * 
     * 142 2019-01-29 12:49
     * 脚本在执行出错后，将错误信息写入ScriptVO中
     * 
     * 142 2019-01-24 13:47
     * 做了大改动，脚本采用直接调用方式运行。只有个别脚本加载了扩展包路径时，才做反射调用
     * 自从改成了直接调用，运行速度更快了，天也仿佛更蓝了。
     * 
     * 141 2019-01-16 11:18
     * 支持指定脚本加载扩展类路径中的jar包（扩展类路径相对于 /WEB-INF/ext_lib）
     * 这样就可以避免项目不断的增加jar包，同样的功能，还需要加载不同版本的jar包，比如
     * POI，有的脚本需要这个版本的，有的脚本需要那个版本的，如果都放到/WEB-INF/lib
     * 中，就会出现版本冲突，导致哪个版本都无法使用。
     * 这回可以将不同版本的POI分别放到ext_lib中不同的子文件夹。然后在不同的脚本
     * 中，指定需要的版本的子文件夹，从而实现多版本并存，而且避免了交叉引用。
     * 
     * 140 2018-12-24 16:52
     * 解决了表状态处理的BUG，并且统一了源数据源与别名数据源的表状态操作
     * 
     * 140 2018-11-21 10:33
     * SDate类中增加了与当日0点时间做比较的方法
     * 
     * 140 2018-11-13 11:17
     * 去掉了两个父类脚本，简化了脚本类调用
     * 
     * 139 2018-11-12 19:58
     * 去掉了BaseService脚本，将其中的方法提取到了新建的BaseParent，作为动作父类跟服务父类共有的父类
     * 
     * 139 2018-11-08 13:25
     * 修改了配置文件发生变化时，配置文件处理类无法自动加载变化后的数据问题。
     * 
     * 139 2018-09-13 13:26
     * 简化了整个架构中日志初始化步骤
     * 增加了从配置文件中读取配置，判断是否扫描 WEB-INF/classes 文件夹中的类
     * 
     * 139 2018-09-10 13:13
     * 资源占用超时，需要判断该资源是私有资源还是公有资源。如果是私有资源，则强制关闭。如果是公有资源，只发出警告
     * 
     * 139 2018-08-10 13:33
     * 新版本的谷歌浏览器中，屏蔽缓存勾选框并不能禁用HTTP缓存方法，在总过滤器中增加了一个全局变量，用于屏蔽HTTP缓存方法
     * 
     * 139 2018-08-06 16:20
     * 增加了纯java类脚本托管父类功能，即框架调用父类中定义的_executeX方法，可由父类调用其子类脚本中执行入口_execute方法
     * 
     * 139 2018-07-30 15:35
     * 增加了集群集中日志输出功能
     * 增加了文件保护分发功能
     * 重写了日志模块 
     * 
     * 138 2018-05-02 17:45
     * 增加了代理数据库驱动，可以在底层拦截数据库操作语句。通常用在嵌入其他系统中，通过JDBC驱动拦截数据库操作语句，用来记录数据变动等审计功能。
     * 以前拼参数变量都是这么拼的  <@key>  拼SQL语句中的参数变量都是这么拼的 <@key@> 现在都是 <@key@>
     * 
     * 138 2018-02-07 10:08
     * 在配置文件中增加了是否为本地开发模式development_mode配置参数。
     * 允许本地开发模式不写入日志文件，可以屏蔽指定源文件夹中的脚本。
     * 
     * 138 2018-02-06 18:37
     * 增加脚本文件夹中，如果存在文件名为 .disabled 的文件，则不扫描当前文件夹以及其子文件夹中的脚本文件。
     * 然后会自动删除对应的脚本编译类，不执行这些类。 这个功能通常用在本地开发环境，有些文件夹中的脚本需要
     * 连接指定的数据库，而本地环境没有。导致大量的的脚本报错。增加了这个文件，即可在本地环境不启动这些脚本
     * 还不影响本地SVN提交（需要将本地的.disabled 文件设置为svn忽略）
     * 
     * 138 2018-01-25 14:40
     * 增加了项目标识，不通环境中的项目标识是不同的。
     * 数据主键值的前缀采用项目标识。
     * 脚本增加了项目标识作为后缀，避免在不同环境开发脚本，在整合的时候出现脚本名冲突的问题
     * 解决了任务消息处理错误导致内存溢出的问题。
     * 
     * 138 2018-01-19 17:39
     * 兼容了Tomcat8中的Servlet3.1规范 
     * 
     * 137 2018-01-18 16:08
     * 为Json对象增加了status() 和 msg() 方法，直接返回状态值和错误信息
     * 
     * 137 2018-01-17 16:13
     * 解决了热部署核心架构包后无法自动重启，导致网站瘫痪的问题
     * 在系统状态信息中增加了内存相关信息显示
     * 
     * 137 2018-01-12 16:31
     * 在ABase基类中增加了可以直接读取网站指定文件内容的方法 fileContent 
     * 
     * 137 2017-12-22 09:20
     * 在配置文件类（在基类中可以获取到全局类实例）中增加了设置、获取、清空全局参数对象容器功能。
     * 
     * 137 2017-10-12 14:14
     * 增加了表状态服务，在服务父类中增加了更新表状态值，和获取表状态值
     * 
     * 137 2017-09-11 10:59
     * 在数据库查询类中增加了一些常用方法
     * 
     * 137 2017-09-05 10:35
     * 相对路径即： <%=up:1%>  即返回当前请求的相对根路径的相对路径，其中1是保留一级路径
     * 比如当前请求 /path1/path2/path3/index.html  调用up功能返回  /../../.. 并且保留一级，最终为 /../..
     * 实际上的相对路径为： /path1
     * 这样避免写死 path1 的名字
     * 
     * 引用文件静态页面标签<%file:引用文件路径%>增加了新的规则  <%file:up:1:引用文件路径%>
     * 可以引用相对根路径，并且保留几级子路径的指定文件
     * 比如：<%file:up:1:/common/inc.html%> 当前请求是：http://localhost/vh1/mana/path1/path2/path3/index.ha
     * vh1 是虚拟路径   inc.html 文件实际保存在  /mana/common/inc.html 中
     * 相对根路径是 /  up:1: 保留1级路径,即 /mana  在引用之前，先将路径自动转换为  ../../../common/inc.html
     * 然后再自动转换成实际路径并加载其内容
     * 
     * 137 2017-04-27 13:07
     * 脚本内容同意进行Base64编码，这样在脚本内容中也支持了XML信息，解决了特殊字符显示问题。
     * 强大的集群分布式运行，支持远程方法调用，反向触发调用。
     * 
     * 136 2017-04-11 14:14
     * 修改了主子记录集类 ParentChildList 以前的没法用，现在方便多了
     * SListMap 类支持迭代，可以使用 for(E ele:slistMap){} 循环方式
     * 
     * 136 2017-04-10 22:28
     * 解决了框架处理数据库事务没提交的问题
     * 在ABase类中增加了 urlEnc(src) 方法，对字符串进行url编码或解码urlDec(src)
     * 
     * 136 2017-04-04 17:01
     * 前端可能用到不同的列表插件，做分页时提交的分页参数会有不同。在接收参数时，
     * 程序先从request中获取参数：key_query_page_no，key_query_page_size 
     * （这两个参数可以写在父类beforeRunAction中）获取分页参数名，如果没有获取到，
     * 从线程中再获取一次，如果还没有，采用默认的pageNo或page_no，pageSize或page_size 
     * 
     * ThreadSession 中有get获取值方法，但是放入值的方法却叫sPut，这太让人匪夷所思了，果断改为put
     * 
     * 136 2017-04-03 23:20
     * 基类ABase中增加了调用目标服务器接口的方法，_call(url,data):Json
     * 136 2017-03-31 10:45
     * 框架增加了程序路由功能，通过这个功能，使项目走向了分布式运行的阶段
     * 兼容了早期Tomcat5.5
     * 解决了一些运行在linux兼容性问题
     * 作为模块运行在已有的程序框架中，并解决了兼容性问题
     * 去掉了几乎没用过的冗余的页面嵌入动态代码标签，功能保持不变
     * 页面嵌入动态标签仅用_action属性即可，无需在用_execute="yes"
     * 
     * 135 2017-03-23 16:58
     * 简化了项目配置文件数量，将固定不变的配置文件都放在了框架包内部。
     * 将管理台程序放在类框架包内部
     * 
     * 135 2017-01-22 11:46
     * 在脚本中增加了新的复杂SQL解析方法 <%SQL$   $SQL%>,使SQL语句更加灵活
     * 
     * 135 2016-12-23 15:24
     * 增加了同一用户防止重复提交同一个动作（这个动作还没执行完，又执行了一次）控制
     * 
     * 135 2016-12-09 10:10
     * 使用内置web服务器时，不用再引用servlet-api.jar包了，已经做了内置。
     * 
     * 135 2016-12-08 14:46
     * 修改了生成脚本的类的头字母，原本是S开头的。但是服务脚本开头也是S开头（生成的类为SS开头），在程序判断中带来很大麻烦。已经修改为符号___开头
     * 使用内置的web服务器时，可以不用配置文件了，默认80端口，虚拟路径为/
     * 框架终于有自己的文档了
     * 
     * 134 2016-11-15 14:19
     * 修改了数据字典接口IDataDict中的方法，增加了参数，使数据字典类更加强大，但是需要注意，之前写好的数据字典接口都要修改。
     * 
     * 134 2016-11-09 15:05
     * 将dt() ts()d() t() ms() 方法到 ABase 基类中
     * ABase中增加了 p(key) 方法获取配置文件中的参数值
     * ABase中增加了px(key) 方法 获取配置文件中的xml参数对象
     * ABase中增加了 pf(key) 方法获取其它配置文件xml对象
     * 
     * 134 2016-11-08 11:35
     * 基本类中增加了pe(e); 方法，简化打印异常信息方法。
     * 
     * 134 2016-11-07 19:45
     * 框架经历了两件大事
     * 1.要运行在weblogic上，各种报错。weblogic解析http协议比较严格，之前在tomcat正常的地方都报了错.
     *   原先靠框架包定位到脚本相关路径的方式无法使用了，因为weblogic把用到的jar包迁移到了另外的文件夹中
     *   导致无法定位到项目相关文件夹，在启动初始化过滤器时，获取到网站根路径，然后定位到WEB-INF文件夹，以这个文件夹为核心
     *   另外在编译脚本时，无法获取到程序已经加载的包路径，其中包含必须要用到的servlet-api.jar这个包是标准包，任何servlet容器都有这个包
     *   但是在weblogic中找不到了。现在已经改成在初始化过滤器时（过滤器配置信息类实现的抽象父类就在这个包中），通过过滤器配置信息类定位到了servlet-api.jar包
     *   然后将这个包放到了类工厂中。在脚本编译处理类中再从类工厂中获取出来。（为啥这么复杂，这叫标准流程）
     * 2.客户对安全这块要求非常高。理论上安全的（WEB-INF里面的内容都属于安全的），结果不同意，最后删掉了源码脚本，备份文件夹，只留下编译后的脚本文件夹
     * 
     * 
     * 134 2016-11-03 19:29
     * 之前启动系统时，先定位classes文件夹，然后再依据各个相对路径定位到网站根路径，配置文件路径等等。
     * 但是这次在WebLogic上运行，遇到了麻烦，WebLogic将jar包复制到它自己的缓存文件夹，导致定位classes文件夹
     * 出现错误，这次利用启动时定位网站根路径，然后再定位WEB-INF文件夹，不再使用classes文件夹
     * 改动量比较大，与老程序兼容性需要仔细调整
     * 
     * 另外，如果将此框架应用在非网页项目（直接启动的程序），也需要建立WEB-INF文件夹
     * 
     * 133 2016-10-27 11:30
     * 在服务类父类中增加了一些数据库操作的常用方法 d() t() dt() ts()  返回日期，时间，日期时间，时间戳
     * 
     * 133 2016-10-26 14:18
     * 在动作根类中增加了 $d(key,defValue)方法，如果页面提交值为空，则返回默认值
     * 数据库操作扩展类中增加了 upkd(String tableName,Map<String,String> defDataMap) 方法，用defDataMap覆盖页面提交值，更新到数据库中
     * 
     * 133 2016-10-25 18:25
     * 给Json类中增加了 toList toMap toSMap 返回字符串型值的容器 
     * 
     * 133 2016-10-24 15:42
     * 在动作根类中增加了 ctx() 方法获取动作上下文
     * 
     * 133 2016-10-20 03:00
     * 在动作类父类中增加了 sendError 方法，可以直接向页面返回404、500错误标识
     * 我的生日是在凌晨编写代码中度过的~~~~，不知不觉已经NULL岁了啊，艾玛，要抛空指针~~~~
     * 
     * 133 2016-10-16 23:06
     * Json 类中增加了newJson(Object value),妈妈在也不担心我构造Json对象了。
     * SDate 增加了 ts() d() t() dt() 方法，能简化的一律简化。
     * DBQuery 增加了 qs 方法，直接返回字符串。 os方法，直接返回首条记录字符串
     * 动作类根，增加了 String[] $(String[] keys) 方法，用于无需声明入参，在拼装更新数据库提交数据时使用。注意：需要从页面请求中获取值的主键开头 为@
     * $().getClientIP() 获取客户端IP地址，却不会返回代理服务器地址
     * 动作类根中增加了 uid() uname() ts() dt() d() t() 方法返回用户主键用户名信息，用于手动更新数据库时使用
     * 动作类根，服务类根中增加了 ms()方法，返回当前毫秒值
     * 
     * 133 2016-10-13 16:03
     * 如果动作类脚本的传入参数勾选为必选参数后，实际并没提交该参数。框架直接用传入参数说明做错误提示，
     * 提示给用户什么为空。 在写传入参数注释说明时。 说明字符串中 //符号后面的字符串不会输出到页面上
     * 
     * 133 2016-10-02 14:46
     * 取消脚本中分别返回传入参数名和类型序列的方法，改为返回参数信息对象序列的方法
     * 如果脚本传入参数被勾选为必传参数，如果没传，会直接抛异常出去 （只针对动作类，页面传入参数）
     * 增加了数据库查询操作，将查询出的记录集采用这种方式输出为字符串 
     * row1_col1|row1_col2|row1_col3,row2_col1|row2_col2|row2_col3
     * 即字段值之间用|分割，行数据之间用半角逗号分割
     * 增加了 <%J{   }J%>  复杂Json语句解析语法
     * 
     * 133 2016-09-29 21:29
     * 发现跟其它系统以Json作为数据格式做对接时，发现了一些问题。Json格式没有统一的标准格式，比如主键值为空时，标准格式是空字符串，因为空值
     * 的主键根本没必要放在数据中。但是传过来的Json数据中，有的主键值为关键字null，之前程序也做了处理，遇到null强制转换为空字符串。但是
     * 发送方在发送前对数据字符串做了签名。我们接收到并用Json类解析后，再将需要做验签的部分转成字符串，问题就来了，验签失败。
     * 这回Json类改为 这样，如果在解析Json字符串时发现存在null关键字，输出的时候也带这个关键字。
     * 
     * 在脚本中，复杂字符串书写格式中带的换行，最后都被强制的去掉了。这样做原本是为了将复杂字符串用在sql语句处理上，但是其它地方也需要，比如
     * 在脚本中编写js脚本，可以用复杂字符串方式，那么问题就来了，输出的内容都被去掉了换行。
     * 已经改为带有换行。专门为sql语句的复杂字符串方式还是去掉了换行符。
     * 
     * 133 2016-08-01 14:33
     * 数据库驱动层报错关闭连接后，数据库连接池并不知道，并且每次都返回这个问题连接，导致操作数据库报错后，再也无法恢复（已解决）
     * 
     * 133 2016-07-26 16:04
     * 增加了补丁管理功能
     * 修正了定时任务，间隔时间时，结束时间延后一个单位的错误
     * 
     * 133 2016-07-12 13:08
     * 增加了代理过滤器，可以动态代理其它web服务，非常实用
     * 
     * 132 2016-07-06 17:50
     * 总结了几条经验，日志中能不写汉字就不写，因为频繁输出日志，量很大。
     * 
     * 132 2016-07-04 19:04
     * 增加了Js轮询方式显示实时日志
     * 
     * 132 2016-06-22 10:26
     * 传统类脚本的版本号由类文件的更新时间改为读取类内部版本号，避免本地跟远程脚本版本总是对不上
     * 
     * 132 2016-06-16 17:46
     * 增加了页面同步脚本功能
     * 
     * 132 2016-06-07 14:02
     * 日志类中增加了dataLog() 方法，用来输出交易数据到独立的日志文件中
     * 独立的交易数据日志文件，每天只有一个日志文件，第二天时，将上一天的日志文件打包
     * 
     * 132 2016-06-03 14:22
     * 在动作脚本中，out(id,value) 方法，只能设置html中的第一个符合条件的值。已经改为设置全部符合条件的值
     * 
     * 132 2016-05-23 13:39
     * 接触到了PostgreSQL数据库，在拼装sql语句时，并不像其它数据库一样，传入字符串类型的值
     * 必须按照字段类型传入，比如整型的字段，必须传入整型的值。后在数据库操作类中增加了该套方法
     * 
     * 132 2016-05-19 13:05
     * 数据库操作类中，增加了无需构建分页处理信息类，即可返回查询后的分页数据对象
     * 
     * 132 2016-05-05 15:12
     * 改用JDK1.6进行编译。既可以运行在JDK1.6下，又能运行在JDK1.7下
     * 废除JDK1.6专用包，否则两头一起维护实在太麻烦。
     * 
     * 131 2016-04-26 14:35
     * 可以在jar包内部写支持类加载器管理的类，无需配置文件中配置
     * 
     * 131 2016-04-25 11:20
     * 如果父类中声明了初始化方法，初始化后方法，注销方法，注册类主键，子类可以不用再声明了
     * 
     * 131 2016-04-12 14:03
     * 所有的类都可以采用脚本方式编写
     * 但是不赞成用脚本写传统类，很容易出错
     * 
     * 130 2016-04-06 19:06
     * 增加了强制不带返回值的脚本代码
     * 
     * 130 2016-04-03 00:01
     * 为JDK6重新构造了一遍框架，主要针对世面上的虚拟机，只支持JDK6
     * 增加了不同域名指向不同的子文件夹，实现同一个虚拟机支持多域名服务
     * 
     * 130 2016-03-21 18:35
     * 在Action脚本中调用其它脚本（服务），如果其他脚本的传入参数也存在
     * 于页面提交的参数中，则可以直接从页面提交的参数中提取参数值 <br/>
     * 注意：并不是把动作上下文传入目标脚本中。
     * 
     * 130 2016-03-15 16:53
     * 实现了外挂脚本代码统一分配，避免不同环境开发的脚本，代码名重复
     * 增加了脚本调用事件接口，实现这个接口的脚本父类，每次被调用之前和之后，会同一调用这两个方法
     * 
     * 130 2016-03-09 10:55
     * 实现了多接口，通常情况下，将脚本直接当作java类使用时会用到
     * 
     * 130 2016-03-08 13:46
     * 支持脚本当作java类使用，可以在脚本代码中直接饮用其他的脚本（需要在输入框中声明引用的脚本类主键）
     * 
     * 130 2016-03-02 11:27
     * 脚本父类主键处，可以直接输入完整的类路径
     * 
     * 130 2016-02-25 12:44
     * 新增父类脚本，以后几乎所有类，都能采用脚本方式编写
     * 
     * 130 2016-01-26 14:02
     * 为Json对象增加了时髦的，洋气的 add put get 方法
     * 原来log传入的内容参数都是String类型，已经都改为Object类型
     * 
     * 130 2016-01-25 10:08
     * 处理了MultipartServletRequest上传文件处理类，提交空文件报空指针问题。
     * 如果系统报空指针，日志监控程序发现后执行了System.exit(1)，但无效。已改为halt方法强制停机。
     * 增加了PidUtil类，在程序启动后，会将进程号写入文件。
     * 
     * 130 2016-01-24 15:29
     * 在Json类中增加了clearEmpty方法，如果设置到json中的值是空值，目标接口可能无法正确返回消息，需要去掉空值参数
     * 
     * 130 2016-01-13 14:24
     * 发现实时日志显示动作中使用了join线程方法，导致关闭日志页面后，该动作仍然在运行中，最后导致大量线程阻塞。修改为不适用join线程方法
     * SDouble，SFloat 中增加了截取小数点位数方法cut，不做四舍五入
     * 
     * 130 2016-01-04 11:06
     * 增加了json跨域方式调用 jsonp
     * 
     * 130 2015-12-29
     * 修改了很多东西，大部分都忘了
     * 增强了脚本管理，文件管理的备份机制
     * 修改了Json处理错误
     * 修改了定时任务处理错误
     * 
     * 130 2015-09-15
     * 修改了数据字典接口，提高了一些效率，理论上
     * 脚本功能，支持提交的脚本内容经过Base64加密，避免脚本内容中也包含了xml，导致保存出错。
     * 脚本中增加是否输出日志功能，是否为同步脚本功能。
     * 
     * 129 2014-06-03
     * 删除了XML解析类，通过IViewHandler解析XML 2014-07-30
     * 最低支持JDK版本为1.7，符合JDK1.7规范 2014-06-03
     * 
     * 128 2013-01-07
     * 在动作类中声明类变量，页面提交上来的参数会自动设置到同名变量中 2014-05-06
     * 增加读取开发模式的参数配置文件，如果存在该文件，就不会再加载其它参数配置文件 2014-04-19
     * 在java类中，将数据包设置到页面中，增加了命名空间概念，支持多个数据包同时设置到同一个页面，避免数据重复设置
     * 在多域名模式下，不同的域名分别调用不同的总做管理类，相对独立，但过滤器确实公用的。已经修改为除了可以设置为公用过滤器，也可以设置为某个域名的私有过滤器 2013-05-09
     * 国际化功能，目前已经支持跟随浏览器的语言自动转换 2013-04-12
     * WebBootStartup网站启动类增加了运行参数，指定了网站根路径 2013-04-10
     * 强化了国际化支持 2013-04-07
     * 增加了启动服务类，以非网站模式运行 2013-03-29
     * 数据包文件加载类原本可以嵌套，已经去掉该功能，一直都没用上。增加了可以将数据包路径注册到该类中来实现加载不同地方的数据包 2013-02-28
     * 注意：禁止在通过配置文件设置属性值的方法中通过类加载器加载指定类，会造成死锁 2013-02-01
     * 服务类与动作类都不需要写配置文件了 2013-01-07
     * 增加通用数据包根路径 2013-01-31
     * 支持加载指定文件夹中的配置文件 2013-01-31
     * 
     * 127 2012-11-06
     * 在注册服务中如果注册失败，抛异常出来，以前是忽略该注册类，导致错误很难排查 2012-12-24
     * 动作类可以不用写对应的同名配置文件，类加载器照样加载，并按照其父类配置文件进行配置 2012-12-11
     * 动作类父类中增加了按照视图主键获取到路径做URL重定向的方法 2012-12-11
     * 动作管理类中增加了通用动作路径功能，实现了按照动作类的类名和方法名拼装动作路径 2012-12-11
     * 数据包记录集中增加了两个固定字段的值，_rs 记录集序列号，从1开始。_ps按分页序号开始的记录集序号 2012-12-07
     * 新增了XML格式的配置信息处理类，废弃文本格式的。新的XML格式支持引用其它文件，复杂格式的配置信息 2012-11-06
     * 数据字典功能中，增加了子主键，可以在一个字典类中支持多个子字典 2012-11-16
     * 
     * 126 2010-09-05
     * 在模板文件中引用了一个子页面模板，从这个子页面模板中可以获取主页面模板的参数值 2012-07-29
     * 去掉了虚拟路径处理机制，增加了多域名判断指向不同路径以及不同的动作管理类机制 2012-07-29
     * Servlet过滤器中增加了屏蔽模板扩展名功能，这样可以使模板与静态文件放在同一级文件夹中，方便美工开发 2012-07-05
     * 直接调用动作路径时，可以传入参数指定模板路径 2012-07-03
     * 数据包操作数据库模块增加了数据字典转译指定字段值功能 2012-06-20
     * ServletManager 引用其它文件功能，除了可以引用模板，增加了也可以引用静态文件 2012-06-20
     * 增加了通过日志处理类捕获指定异常，并调用处理程序。比如捕获内存溢出异常后终止进程 2011-12-27
     * 菜单权限管理中，增加了是否屏蔽公共菜单项 2011-11-25
     * 增加了简化数据库查询方法 2011-11-10
     * 新增了一个功能，可以改变源码包中所有java文件的编码，方便阅读 2011-11-01
     * 增加了字符串堆栈，固定堆栈大小，满负荷后覆盖最老的字符串信息 2011-10-24
     * 在ABase基类中增加了一个构造继承ABase并设置基类信息的方法
     * 动态解析模板  _execute="yes" 当节点名为 execute 时，不显示该节点信息，只显示其子节点信息
     * 修改了类信息容器 BeanVO，大大减少的内存消耗
     * 优化了复杂sql语句段处理方法
     * 增加了插件初始化排序功能
     * 在类加载器中增加了，将非当前类加载器加载的类实例强制转换为本地接口的类实例
     * 动态节点 _execute="yes" 增加了相关标签主键属性 relateids 在处理当前标签数据时
     * 也连带处理相关标签
     * 从第一版中移植过来FTP传输处理功能
     * JDK中自带的FTP客户端太操蛋了，兼容性极差，还不稳定（有时会执行失败），决定放弃支持
     * 数据库连接池增加异常检验数据库是否正常功能  2011-05-13
     * 解决了对象池隐藏了很久的错误，导致异常时无法释放对象  2011-05-13
     * 解决了JSP编译后乱码问题 2011-05-17
     * 类加载器增加无类主键XML描述支持，有些动作类无需其它类加载调用，所以主键是无用的 2011-05-19
     * RootMenuAction 功能块管理中，增加了 超级用户访问时是否显示该功能点的属性控制 2011-05-20
     * 增加了按照不同的域名调用不同的ServletManager 2011-06-01
     * 类头部的 public final static String VER 和  CLASS_TITLE 去掉了public标识 2011-06-01
     * 在模板文件中允许跨插件调用动作 2011-06-08
     * 咚咚锵，取消了数据包中的字段索引信息设置，按照xml的先后顺序排序 2011-06-09
     * 哇咔咔，数据包中可以不用声明数据包主键，默认使用文件名作为数据包主键 2011-06-10
     * 取消了PublicActionBean 公共父类，很少用到，将最常用的方法放到了动作类父类中 2011-06-14
     * 数据包中取消了是否为基本数据包的声明isBase，如果存在表名信息声明，则默认为基本数据包，扩展数据包不用声明表名信息 2011-06-14
     * 取消了SDouble 和 SFloat 中allDigit数字全长控制。容易导致数据错误
     * 
     * 125 2010-08-08
     * 修改了类加载器管理范围混乱。
     * 框架使用经验已经转到另外一个文本文件中
     * 支持模板放到其它文件夹中（以前只能放到网站根目录）
     * 增加字符串排序类 StringSorter
     * 可以让日志输出到网站前台
     * 增加了HTML动作类父类
     * 
     * 123 2009-12-21
     * 采用全新层次架构，简化开发工作量
     * 类加载器增加了Path属性的参数值，可以自动将配置文件中的相对路径转换成绝对路径
     * 
     * 定义规则：
     *     所有方法声明抛出异常只有Exception，在程序过程中throw new 异常为实际异常类型
     *     
     *     类加载器编号为空时，父类加载器或者更上一级的类加载器中获取。
     *     如果获取类实例时指定类加载器编号则只能在父类加载器的一级子
     *     类加载器，或者父类的父类一级子类加载器中获取
     *     
     *                   
     *                                [04A BF]         [05A BF]
     *                               /                /
     *                        [03A BF]---------[04B BF]------[05B BF]-----[06A BF]
     *                        /      \                \             \
     *                       /        \[04C BF]        \[05C BF]     \[06B BF]
     *                      /                 \
     *                     /                   \[05D BF]
     *                    /
     *     [01 BF]---[02 BF]---[03B BF]---[04D BF]
     *                     \
     *                      \[03C BF]
     *                      
     *   例如： 06A BF类加载器中的类
     *   
     *         能获取到 06B,05A,05C,04A,04C,03B,03C 类加载器中的资源
     *         无法获取到 05D,04D 类加载器中的资源
     * 
     *  增加了类注册接口，如果一个类的配置文件中指定了一个注册类主键，则在类加载器
     *  初始化到该类后，会调用注册接口类实例方法进行注册。 2010-04-22
     *  
     * 重新决定采用接口影子类实例方式获取目标类实例，因为如果跨插件类调用的话，插件A中
     * 类a调用插件B中的类b，只能返回Object类型，因为插件A中不能直接引用插件B中的类型
     * 所以类加载器在返回插件B中的类b实例时，动态生成符合插件A中接口的影子类b，这样
     * 就减少了开发代码的复杂度，也解决了插件间紧密耦合的弊端。 2010-04-30
     * 
     * 取消了依赖其它类声明属性，增加了类加载器加载所有类完毕后调用的方法，执行该方法
     * 后，会轮询所有类信息，执行声明了加载成功后需要调用的方法。2010-04-30
     * 
     * 类加载器中增加了两个factoryid关键字： _root 根类加载器  _parent 父类加载器。2010-05-04
     * 
     * 插件管理模块在插件总配置文件中增加了引用其它配置文件中的类信息方法。2010-05-05
     * 
     * 122 2009-10-15
     * 将接口中应用的类改成了对应的接口
     * 从数据包类中提取出业务逻辑处理，使数据包变成纯Bean
     * Web服务器增加了启动时间 2009-10-16
     * 增加了数据库数据包操作类 2009-10-19
     * 增加了H2数据库服务器启动类2009-10-19
     * 修改了启动处理类无法调用classes中的类的错误2009-10-20
     * 重写了HTML解析类，减小了处理时占用内存量和提高了执行效率2009-10-28
     * 重写类XML基础解析类，减小了处理时占用内存两和提高了执行效率2009-10-27
     * 修改了记录集对象中不规范的方法名2009-10-28
     * 修改了单点登录处理接口不规范2009-10-28
     * 优化了远程方法调用2009-11-05
     * HTML解析类中增加了解析XML属性设置2009-11-05
     * 优化了数据库数据包初始化类2009-11-06
     * 增加了基本插件管理2009-11-06
     * 增加了解析JSP Servlet 2009-11-18
     * 设置默认关闭缓存 2009-11-24
     * 增加了排序容器SortVector 2009-12-03
     * 修改了web服务器，动态搜索配置文件路径 2009-12-11
     * 
     * 121 2009-06-11
     * 修改了BeanFactory类中类加载器访问机制 2009-06-11
     * 增加了RAR处理隔离类，需要jarar功能包支持，如果没有这个包，程序将空执行，不会报错2009-06-12
     * 修改了类加载器IBeanFactory 增加了设置文件处理类方法，通过根路径中的类定位类根路径方法 2009-07-17
     * 增加了HTML页面变量 <!--# 变量名=变量值 --> 功能
     * 增加了页面代理类绑定功能 <!--# controlbean="类主键" --> 如果代理类需要会话控制，那么对应的页面也需要
     * 修改了动作错误处理机制
     * 内置Servlet容器可以解析web.xml中welcome-file-list段 2009-07-22
     * Bean参数类型中增加了Map 和 List参数类型 2009-07-29
     * 在Bean参数类型中增加了XML类型，可以将复杂的值通过XML在自己的类中解析出来 2009-07-29
     * 在动作类中增加了初始化方法init(IHtmlContext)，在调用动作活服务之前会先执行该方法 2009-07-29
     * 在HTTP上下文中增加了下载文件处理类 2009-08-11
     * 可以在配置文件中设置全局记录集分页每页记录数 2009-08-11
     * 修改了HtmlHandler在使用getNodeText()方法返回XML CDATA时，连该标识信息也一同返回的错误  2009-08-11
     * 修改了文件上传时的几个别现象，最后一次读取文件末尾内容是一个回车符（上传文件末尾通常为换行符+回车符）,导致上传后文件多了一个回车 2009-08-14
     * Bean类加载器中增加了设置字符串路径方法 2009-08-17
     * 数据包文件管理类增加了读取数据包初始化脚本方法 2009-08-19
     * 数据包文件管理类增加了执行测试数据脚本方法 2009-08-20
     * 增加了自动扫描jar/zip包并放入classpath的启动类 2009-08-24
     * 类加载器接口标准化 2009-08-27
     * 类加载器支持类主键前缀，不同域可以用相同类主键 2009-08-27
     * 增加了顶级异常转向指定路径动作 2009-09-14
     * 在DBSys类中增加了更新CLob字段值 2009-09-21
     * 
     * 120 2009-03-12
     * 简化了框架中无用的代码 2009-03-12
     * 修改了类加载器无法加载远程接口问题 2009-03-12
     * 修正了PublicActionBean中的方法命名错误 2009-03-13
     * 修改了HttpServletRequestImpl类中的getHeader(arg)总返回空字符串的错误 2009-03-18
     * 内置Web服务器可以关闭启动logo方法 2009-03-20
     * 增加了提交XML内容处理类 2009-03-20
     * 除去com.jphenix.share.xml.baseinstancec.BaseXml类 无用处 2009-03-23
     * 修改了调用存储过程错误 2009-03-25
     * 修改了数据包处理带GroupBy语句的分页数据时，数量错误问题 2009-03-26
     * 增加了WebServiceBeanParent父类 2009-04-01
     * 新增HTTP协议调用方法类 HttpCall 2009-04-02
     * 修改了远程方法调用错误 2009-04-20
     * 修改了FTP任务处理类，在遇到其中一台FTP服务器无法访问时，导致所有FTP任务阻塞错误 2009-04-20
     * 强化了BeanFacotry中管理类加载器模式 2009-05-15
     * 简化了远程参数传递（单点登录核心）管理。禁止将信息保存到远程服务器中 2009-05-18
     * 
     * 119 2008-09-09
     * *在动作配置文件中，页面路径映射表中可以写动作路径
     * *动态扫描配置文件加载类功能中增加了加载自定义部署文件夹中的类
     * *修改了无法获取自定义部署文件夹中类的VER和CLASS_TITLE值
     * *类加载器启动时，校验类路径是否合法
     * *JarTools类中增加的逐步解压缩方法
     * *动态解析动作管理类中增加了包含类相对路径和排除类相对路径设置
     * *搜索加载类中增加了包含类相对路径和排除类相对路径设置
     * *修改了SDate函数获取年原日字符串时输出错误信息
     * *在FileCopyTools类中增加了复制文件夹到指定文件夹中
     * *修改了设置类其中一个方法时发生错误后，不再继续设置该类后面的方法。
     * *修改了记录集对象中返回字段主键数组，不再返回空值
     * *修改了拼装sql语句时，使用自定义语句段时发生的错误
     * *修改了SFloat,SDouble类型解析长数字字符串时发生错误
     * *增加了PubActBeanParentActionWrapper公共处理类，该类可以判断动作类是否实现了
     *  IActionWrapper接口，来调用该接口中的方法，通常其动作类的父类实现该接口
     *  该功能可以用来控制不同的用户是否登录，页面转向等等
     *  增加用户会话信息类接口IUserSessionBean
     *  ftp传送增加了建立ftp路径方法
     *  HtmlHandler类也支持解析xml格式内容
     *  将警告日志变成的错误级日志，避免出现问题找不到原因
     *  页面上下文HtmlContext对象中增加了操作Cookie的方法
     *  动作类中增加了调用其它动作类，并将返回页面设置为当前返回页面
     *  上传文件出现问题
     *  修改了内置服务器访问页面经常失败的问题
     *  数据包中的表类增加了替换字段主键方法，用该方法可以动态生成数据包（无需数据包配置文件）
     *  新增一些sql语句拼装方法,修改了字段语句段处理错误
     *  修改了HtmlHandler类处理xml时的错误
     *  在HtmlHandler类中增加了一些通过节点名称操作对象的方法
     *  内部XML解析类支持<![CDATA[]]>类型的值
     *  解决了内置web服务器会话主键保存到浏览器中时发生重复的问题
     *  解决了拼装新增,查询字段语句段时,无法加载对应值的错误 2008-11-27
     *  增加了启动内部服务器时,端口被占用时提示错误信息 2008-11-29
     *  HtmlHandler解析类提高了HTML解析的容错性 2008-12-03
     *  简化了数据包配置文件描述sql语句方法 2008-12-04
     *  在基本类型中增加了格式化显示数字方法3,444,333,222 2008-12-05
     *  优化了HTML解析类,使整个系统占用内存更小 2008-12-05
     *  修改了数据包处理默认保留字段的错误 2008-12-07
     *  Sql语句拼装语句对象中增加了获取表对象和字段对象方法 2008-12-08
     *  通过HMTL解析类实现了增加了网络爬虫功能 2008-12-09
     *  在HTML动作类中增加了解析动态HTML的方法 2008-12-12
     *  在StringUtil中增加了将字符串转换为I18n格式 2008-12-18
     *  动态解析html功能中增加了,根据条件是否成立判断是否显示指定块 2008-12-19
     *  修改了无法单独启动服务模式的错误 2008-12-20
     *  页面上下文中可以Cookie可以设置中文值 2008-12-21
     *  内核支持非英文文件夹路径 2008-12-26
     *  HTML解析类支持Word格式的HTML 2008-12-26
     *  发现缓存文件长时间不删除，造成文件量过大导致启动时删除文件时间过长，所以新增一个定时删除过期缓存的服务 2008-12-26
     *  增加了清除Cookie方法，在页面上下文对象中 2008-12-28
     *  修改了调用存储过程后没有释放链接对象的错误 2008-12-30
     *  在数据包对象中增加了从Map容器中获取字段值并设置到字段对象中 2008-12-31
     *  修改了执行sql语句错误时，日志信息不完整的问题 2009-01-06
     *  修改了底层通信类强制将编码转换为UTF-8的问题 2009-01-06
     *  修改了框架无数据库调用时报错的问题 2009-01-07
     *  配置动态模板时，引用其它文件设置的标签属性可以省略___mode属性设置 2009-01-07
     *  修改了链接非默认端口的FTP失败的问题 2009-01-08
     *  去掉了备用数据库链接功能，没有实际用处 2009-01-09
     *  修改了对象池输出的错误日志信息 2009-01-09
     *  在页面上下文类中增加了获取页面提交的参数数组方法 2009-01-11
     *  在request对象中处理了汉字url字符串 2009-01-12
     *  去掉了早期FTP处理类，在新的FTP处理类中增加了PASV模式 2009-01-12
     *  修改了分页处理类，可以指分页动作定提交动作路径 2009-01-14
     *  在字符串处理类StringUtil中增加了提取HTML中的文本内容方法 2009-02-04
     *  修改了基本类型处理类中，处理小数超长导致小数显示问题 2009-02-12
     *  扩展了HTML动作解析类接口 2009-02-18
     *  增加了静态动作处理入口 2009-02-26
     *  FileCopyTools 中新增加了将文件内容写入文件的方法 2009-03-03
     *  解决调用基本类BaseUtil中获取HashMap中的主键序列时，报找不到元素的错误 2009-03-06
     *  解决了XML 或 HTML中 <a><a /></a> 无法解析的错误 2009-03-10
     *
     * 
     * 118 2008-09-03
     * 安全过滤器中屏蔽掉一处跨站脚本攻击的漏洞
     * 如果文件没有日志信息，则不执行备份日志
     * 修改了如果数据包配置文件发生变化，自动加载失败的错误
     * 修改了将提交参数容器转换为字符串方法时，没有处理字符串数组问题
     * 增加了冒泡排序方法,数据包字段索引也采用了冒泡排序方法
     * 日期类SDate中增加了只显示月日字符串，并且页面处理值中也增加了对应的处理
     * 修改了解析html页面中动态代码时，不能处理虚拟路径问题
     * 在内置web服务器中增加了虚拟路径功能
     *
     * 
     * 117 2008-08-29
     * *数据包中增加了自定义语句段，避免在程序设置条件值时中写入sql语句。
     * *类加载器描述文件中增加了接口描述属性interface属性，多个值用分号分割
     *  用来部署类客户端时，按照接口中的描述生成，避免框架自动分析多个无用接口，导致客户端复杂
     * *客户端配置文件中的class属性值也可以写对应接口类路径（不允许有多个接口）
     * *去掉了Abase积累中的生成类日志方法，实际并没多大用处.
     * *字符串处理类中增加过滤字符串中非数字字符
     * *增加了一些异常日志信息 通信，数据库操作
     * *在动作类父类中增加了获取新的主界面对象
     * *修改了加载类时，设置其中一个属性方法抛出异常时，继续设置其它方法，而不抛出异常导致类加载失败
     * *增加了SqlExStringTools中的两个方法，用来拼装复杂语句
     *
     *
     * 116 2008-08-26
     * *增加了Portal获取、保存Portlet配置参数接口
     * *数据包池类中增加了调试模式开关，如果为非调试模式，则启动时不检查数据包是否合法（比较耗时）
     * *增加了调用数据包selectByPK查询时，不处理分页数据
     * *StringUtil类中增加了将参数字符串转换为参数容器，将参数容器转换为参数字符串方法
     * *JarTools类中增加了判断指定文件是否为Jar Zip War 等文件
     *
     * 
     * 115 2008-08-24
     * *增加了类加载器加载完毕后检查主键是否重复
     * *增加了数据包池初始化后检查各个数据包是否合法
     * *增加了日志处理类中的独立启动方法
     * *启动方法默认将启动信息写入启动日志文件中,每次重新启动覆盖旧的日志,写文件功能可以屏蔽掉
     *
     * 
     * 114 2008-08-23
     * *修改了拼装sql语句时，where，order，groupby语句也会使用字段中的sql语句段，目前已经取消
     * *增加了一些类的错误日志详细信息
     * *修改了屏幕输出日志类中无法屏蔽输出执行时间日志信息错误
     *
     * 
     * 113 2008-08-19
     * *修改了Socket服务启动监听失败错误
     * *修改了FilesUtil类中获取文件列表方法的返回值出现重复的分割符//错误
     * *FilesUtil类中如果获取文件列表方法传入指定路径为//时，获取当前电脑所有驱动器符号序列
     * *增加了一个公共动作类和一个公共服务类，将数据库中长字符串字段中的内容读取出来保存成文件，或将文件中的内容写入数据库中的长字符串字段中
     * *修改并增强了长字符串文件模式处理功能类
     * *修改了文件上传模块无法处理长文件名的错误
     *
     * 
     * 112 2008-08-14
     * *新增线程池模块instanceb，旧的模块存在效率问题
     * *修改了分页处理类中的错误
     * *修改了通信类中的内存泄露错误
     * *安全过滤器可以独立使用
     * *修改了在Linux下无法定位文件绝对路径问题
     * *修改了输出流时抛异常的错误
     * *增加了不启动servlet但不加载http管理类的功能
     * *将一些警告日志升级为错误日志
     *
     * 
     * 111 2008-08-11
     * *修改了通信服务类，去掉了一些不稳定代码
     * *新增了文件传输通信类
     * *修改了动态动作管理类不能自动加载动作类的错误
     * *修改了分页处理错误
     * *在页面上下文中增加了设置非逻辑错误对象，用来区分开逻辑错误（主动提示的错误）
     * *修改了动作类父类中，调用返回路径方法传入参数错误
     *
     * 
     * 110 2008-08-06
     * *优化了内置web服务器
     * *内置服务器需要监听控制台输入管道，这与odbc桥冲突，导致连接数据库时无相应。
     * *去掉了内置服务器中监听控制台输入管道
     * *在页面上下文中增加了两个设置表格数据的方法
     * *远程参数处理类中增加了获取并移除容器方法，使现有的执行过程减少了一个步骤
     *
     * 
     * 109 2008-08-01
     * *增加了独立使用数据库连接池
     * *增加了独立使用持久层
     * *修改了内部xml解析类中无法解析转移字符问题，修改为只能解析<>两个字符的转移字符& lt; & gt;
     * *修改了，如果类加载器无法找到配置文件抛空指针问题。增加了错误提示。
     * *屏蔽掉一个连接异常
     * *修改了数据包获取空字段对象后抛空指针
     *
     * 
     * 108 2008-07-29
     * *增加纯服务方式启动，以前的服务方式还是Servlet，现在不是了
     * *修改了类加载器设置管理器根路径方法，原先采用搜索管理器管理路径下的定位文件，
     *  然后根据定位文件和相对根路径位置获取根路径。这个比较耗时，比较复杂，现在修改成
     *  根据类管理器配置文件相对路径,确定根路径。
     *  但这样做的前提是，配置文件必须放在管理器管理文件夹中，设置的配置文件路径必须是相对路径
     * *修改了Socket服务，线程池错误。
     * *修改了Socket连接类，设置缓存大小时抛空指针。
     * *去掉工厂类的定位功能。采用配置文件自动定位方法。
     * *修改了在war包模式时，备份日志线程出错
     * *发现执行数据库语句时，如果发生阻塞，数据库连接池也无法关闭连接，导致持续阻塞。
     *  在连接类中设置了查询超时时间
     * *修改了常用分页处理类处理分页错误
     * 
     *  
     * 107 2008-07-27
     * *框架支持打包成war格式，此改动比较大，改动近40%的程序。
     * *数据库连接池XDBPool支持通过类处理获取数据库连接信息。
     *
     * 
     * 106 2008-07-25
     * *发现Socket通信不稳定，修复了一些可能出问题的地方，并且修改了出错日志
     * *将启动框架时显示的凤凰图案换成了文字信息
     * *内置web服务器启动时，显示凤凰图案
     *
     * 
     * 105 2008-07-24
     * *由于远程调用服务返回整个数据包消耗无用资源，改用返回封装后的记录集对象
     * *在页面上下文中增加了对封装记录集对象设置表数据的方法
     * *允许交互调用服务，比如服务器A调用服务器B，服务器B可以设置为调用服务器A
     * *修改了IRemoteActionBean接口，去掉用用方法，增加获取目标服务器名方法
     * 原来采用类加载器中的setTarget方法设置，但很容易混淆，因为服务类不需要自动部署
     * 通过远程动作管理器统一调用
     * 
     * 104 2008-07-24
     * *修改：HtmlContext类中设置表数据时，如果设置的tr主键与table对应不上，就会报数组错误
     * *修改：如果网站采用安全参数过滤，在某些方法中使用获取原始参数时，获取到的还是过滤后的参数
     * *近一步优化了Socket速度
     *
     * 
     * 103 2008-07-23
     * *增加了用户请求直接转向远程动作功能,只需修改一下本地动作配置文件中的target属性
     * *优化了Socket通信速度，原来单独发送结束标识，现在将结束标识与最后一次发送信息合并在一起
     * 这样的话，低于缓存信息只需要发送一次即可。目前发现每次接收信息都比较耗时，待优化
     *
     * 
     * 102 2008-07-22
     * *取消Demo 动作管理类，很久无用
     * *强化远程调用服务功能，在此之前很少用到在动作类中远程调用服务
     * *将setTarget数据值作为变量放到变量配置页面中
     *
     * 
     * 101 2008-07-22
     * *增加重复动作路径检测，在网站启动后提示出重复的动作路径以及相关信息
     *
     * 
     * @author 刘虻
     * 2008-7-22下午03:50:02
     */
    //public static void history() {}
    
    
    
    /**
     * 框架中搜索所有接口中使用ArrayList 和 HashMap 的地方，都改为了List 和 Map
     * 认为接口中的类型如果也是接口的话，这样程序会更灵活，但后来发现执行效率降低，
     * 比如在clone方法时，接口实例不具备这个方法，所以只能重新构造一个实例，然后对其
     * 做addAll，或者putAll方法。所以后来将接口中的List和Map又改回ArrayList和HashMap
     * 
     * 修改了整个项目中，方法名中包含 ArrayList 或 HashMap，将其改为包含 List 或 Map 
     * 
     * @author 刘虻
     * 2009-11-5上午09:03:07
     */
    //public static void note() {}
    
}
